<?php
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */

/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死，可以将下面declare打开（去掉//注释），并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */

//declare(ticks=1);

use \GatewayWorker\Lib\Gateway;

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    public static function onWorkerStart($businessWorker)
    {
        echo "WorkerStart\n";
    }

    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        //像客户端发送初始化链接
        Gateway::sendToClient($client_id, json_encode(array(
            'type' => 'init',
            'client_id' => $client_id
        )));
    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {
        // 服务端console输出
        // 解析数据
        $resData = json_decode($message, true);
        //将时间全部置为服务器时间
        $serverTime = date('Y-m-d H:i:s', time());
        switch ($resData['type']) {
            case 'bindUser':
                // 绑定uid
                $_SESSION["userId"] = $resData["userId"];
                Gateway::bindUid($client_id, $resData["userId"]);
                // 通知客户端uid生成并存储成功
                Gateway::sendToClient($client_id, self::result_json("bindUser", 0, $resData, $client_id.'绑定成功'));
                break;
            case 'join':  // 用户进入直播间
                //将客户端加入到某一直播间
                Gateway::joinGroup($client_id, $resData['roomId']);
                $resData = [
                    'type' => 'join',
                    'roomId' => $resData['roomId'],
                    'userName' => $resData['userName'],
                    'userId' => $resData['userId'],
                    'msg' => $resData['userName']."上线进入群", // 发送给客户端的消息，而不是聊天发送的内容
                    'joinTime' => $serverTime // 加入时间
                ];
                // 广播给直播间内所有人，谁？什么时候？加入了那个房间？
                Gateway::sendToGroup($resData['roomId'], json_encode($resData));
                break;
            case 'say':  // 用户发表评论
                $resData = [
                    'type' => 'say',
                    'roomId' => $resData['roomId'],
                    'userName' => $resData['userName'],
                    'content' => $resData['content'],
                    'userId' => $resData['userId'],
                    'commentTime' => $serverTime, // 发表评论时间
                    'client_id' => $client_id
                ];
                // 广播给直播间内所有人
                Gateway::sendToGroup($resData['roomId'], json_encode($resData));
                break;
            case 'pong':
                break; // 接收心跳
            case 'close':
                //当client_id下线（连接断开）时会自动与uid解绑
                Gateway::closeClient($client_id);
                break;
            default:
                //Gateway::sendToAll($client_id,$json_encode($resData));
                break;
        }
    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {
        $message = [
            'type'=>'logout',
            'msg'=>$client_id.'下线了',
             'client_id' =>  $client_id,
        ];
        // 向所有人发送
        GateWay::sendToAll(json_encode($message));
    }
    public static function result_json($type = null, $code = 0, $data, $msg = "")
    {
        return json_encode(["type" => $type, "data" => $data, "msg" => $msg, "code" => $code]);
    }
}
